package a_collection.collection.list_demo;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * description:
 * author: xiaoxu
 * createTime: 2018-11-21 15:22
 **/
public class Test {

    public static void main(String[] args) {
        //测试ArrayList与LinkedList性能差异

        //---------添加性能测试-------
        /**
         *  插入100万条Integer类型的数据
         *  ArrayList 时间：58
         *  LinkedList 时间：306
         *  插入1000万条Integer类型的数据
         *  ArrayList 时间：9756
         *  LinkedList 时间：2140
         *
         *  ArrayList（可变数组）进行添加数据操作，
         *      当old数组空间满时，首先创建比原来空间大的new数组。
         *      （可以类比为再次创建新房子）
         *      把old数组里元素转移到new数组里边
         *      （可以类比为搬家）
         *      当数组空间再次满时，需要再次扩容（建造新房子），继续循环
         *
         *  LinkedList （双向链表，可以类比为锁链，
         *      中间的锁链，既能找都前边的一环，也能找到后边的一环）
         *      进行数据添加时，先找到最后一个节点，创建新节点，
         *      此时新节点就是lastNode(最后节点)，
         *      lastNode和prevNode(前一个节点)互相引用
         *
         *
         */
        List<Integer> arrayList = new ArrayList<>();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("arrayList add costTime:"+(endTime-startTime));

        List<Integer> linkedList = new LinkedList();
        long startTime1 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("linkedList add costTime:"+(endTime1-startTime1));


        //--------插入数据性能测试
        /**
         *
         *  1000万条Integer类型的数据,在索引为2的位置插入数据
         *  ArrayList 时间：14
         *  LinkedList 时间：0
         */
        long startTime2 = System.currentTimeMillis();
        arrayList.add(2,222);
        long endTime2 = System.currentTimeMillis();
        System.out.println("arrayList inset costTime:"+(endTime2-startTime2));

        long startTime3 = System.currentTimeMillis();
        linkedList.add(2,222);
        long endTime3 = System.currentTimeMillis();
        System.out.println("linkedList inset costTime:"+(endTime3-startTime3));

        //--------移除数据性能测试
        /**
         *
         *  1000万条Integer类型的数据,删除索引为2的位置的数据
         *  ArrayList 时间：14
         *  LinkedList 时间：0
         */
        long startTime4 = System.currentTimeMillis();
        arrayList.remove(2);
        long endTime4 = System.currentTimeMillis();
        System.out.println("arrayList remove costTime:"+(endTime4-startTime4));

        long startTime5 = System.currentTimeMillis();
        linkedList.remove(2);
        long endTime5 = System.currentTimeMillis();
        System.out.println("linkedList remove costTime:"+(endTime5-startTime5));

        //--------遍历性能测试------------
        /**
         *  10万条Integer类型的数据,删除索引为2的位置的数据
         *  ArrayList 时间：14
         *  LinkedList 时间：0
         */
        long startTime6 = System.currentTimeMillis();
        //10万 消耗时间12
        int size = arrayList.size();
        for (int i = 0; i < size; i++) {
            arrayList.get(i);
        }
        long endTime6 = System.currentTimeMillis();
        System.out.println("arrayList Iterable costTime:"+(endTime6-startTime6));

        long startTime7 = System.currentTimeMillis();
        //10万 消耗时间10119 9730
        int size1 = linkedList.size();
        for (int i = 0; i < size1; i++) {
            linkedList.get(i);
        }
        long endTime7 = System.currentTimeMillis();
        System.out.println("linkedList Iterable costTime:"+(endTime7-startTime7));


        //todo 调用方法和调用内存性能测试(扩展作用)
        long startTime8 = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            arrayList.size();
        }
        long endTime8 = System.currentTimeMillis();
        System.out.println("arrayList.size() costTime:"+(endTime8-startTime8));


        int st =arrayList.size();
        int a = 0;
        long startTime9 = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            //a =st;
        }
        long endTime9 = System.currentTimeMillis();
        System.out.println("arrayList.size() costTime:"+(endTime9-startTime9));





        //测试自己写的MyArrayList
      /*  MyArrayList myArrayList = new MyArrayList();
        myArrayList.add("012");
        myArrayList.add("02");
        myArrayList.add(0,"a");*/

        /*for (int i=0;i<myArrayList.size();i++){
            System.out.println(myArrayList.get(i));
        }*/
    }


}
